package june.asynchronoustest;

import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class NaverParser extends AsyncTask<Integer, Integer, Integer>{
	
	Context c; //컨텍스트.
	String serchString; //검색어.
	String key = "3a2b15266e6879020917091f85a4bc98"; //네이버키.
	ArrayList<NpSerchItem> arryNpsi; //검색결과가 보관될 어레이 리스트.
	ProgressDialog mProgress;
	Handler h;
	
	/**
	 * 컨텍스트와 검색어를 받아온다. 컨텍스트는 별 쓸일 없지만 나중에 추가기능을 구동할때를 대비하여 받아오는게 좋다.
	 * @param c 컨텍스트.
	 * @param s 검색어.
	 * @param h 파싱종료를 알리는 핸들러.
	 */
	public NaverParser(Context c, String s, Handler h){
		//생성자로 넘어온것들을 현재 클레스에 셋팅.
		this.c = c;
		this.serchString = s;
		this.h = h;
		//생성자의 호출과 함께 바로 검색시킬수도 있지만 자제한다.
		//getNaverData();
	}
	
	public ArrayList<NpSerchItem> getter(){
		return arryNpsi;
	}
	
	/**
	 * 검색결과를 반환하는 메소드. 반환형식은 어레이리스트이다.
	 * @return 검색결과입니다.
	 */
	public ArrayList<NpSerchItem> getNaverData(){
		
		arryNpsi = new ArrayList<NpSerchItem>();
		NpSerchItem npsi = null;
		
		//검색어를 UTF8형태로 변환한다. 웹검색을 지원하는 대부분의 api는 UTF가 아니면 에러에러 ( __);
		String m_serchString = "";
		try{
			m_serchString = URLEncoder.encode(serchString, "UTF8");
		} catch (Exception e) {
			Log.d("june", "서치명 인코드 실패. 원인분석 요망 : " + e);
		}
		
		
		try{
			
			//본격적으로 검색할 uri를 제작한다.
			URL url = new URL("http://openapi.naver.com/search?" + //네이버 기본 서치주소. 
					"key=" + key + //네이버에서 발급하는 인증키.
					"&query=" + m_serchString + //내가 넣은 검색어.
					"&target=" + "image" + //카테고리... 랄까? 이 프로잭트에선 이미지를 사용한다.
					"&start=" + "1" + //검색 시작점.
					"&display=" + "100"); //검색 종료점.
			
			Log.d("june", "검색url : " + url);
//			09-06 14:29:36.462: DEBUG/june(3740): 검색url : http://openapi.naver.com/search?key=3a2b15266e6879020917091f85a4bc98&query=%EB%A7%88&target=image&start=1&display=100


			//파서생성. 책에 나오지만 파서는 팩토리를 통해 생성합니다.
			XmlPullParserFactory pf = XmlPullParserFactory.newInstance();
			XmlPullParser xp = pf.newPullParser();
			xp.setInput(url.openStream(), null);
			
			//변환된 검색어를 한번 확인해줍시다.
			Log.d("june", "파싱시작. 검색어 : " + m_serchString);
			
			//테그별 파싱처리.
			int parserEvent = xp.getEventType();
			while (parserEvent != XmlPullParser.END_DOCUMENT) {
				
				switch (parserEvent) {
				
				case XmlPullParser.START_TAG:
					
					//url이 에러없이 만들어지고 검색되면 해당 태그를 통해 각 데이터를 받아올수있다.
					//어떤 테그가 존재하는지 확인하려면 api를 참조하거나,
					//간단하게 로그찍힌 url을 브라우저에 직접 입력해본다.
					//알수없는 xml이 솰라솰라 나올것이다.
					String tag = xp.getName();
					
					//xml태그중 타이틀에 관한 녀석들만 골라낸다.
					if(tag.compareTo("title") == 0){
						//아이템을 하나 새로만들어주고.
						npsi = new NpSerchItem();
						//파서에서 테그 다음줄. 즉, 실제 내용을 스트링변수에 담는다.
						String titlesrc = xp.nextText();
						Log.d("june", "검색결과 : " + titlesrc);
						//만든 아이템에 셋팅.
						npsi.title = titlesrc;
					}
					
					if(tag.compareTo("link") == 0){
						String lingsrc = xp.nextText();
						Log.d("june", "검색결과 : " + lingsrc);
						npsi.link = lingsrc;
					}
					
					//xml테그중 이미지 섬네일주소를 가져온다.
					if(tag.compareTo("thumbnail") == 0){
						//아이템을 새로만들지 않는건 타이틀에서 만든놈을 계속 사용하기때문이다.
						//여기서도 뉴하면 보관했던 타이틀이 홀라당 날아갑니다.
						String imagesrc = xp.nextText();
						Log.d("june", "검색결과 : " + imagesrc);
						npsi.thumbURL = imagesrc;
						
						
					}
					
					if(tag.compareTo("sizeheight") == 0){
						String sizeheightsrc = xp.nextText();
						Log.d("june", "검색결과 : " + sizeheightsrc);
						npsi.h = sizeheightsrc;
					}
					
					if(tag.compareTo("sizewidth") == 0){
						String sizewidthsrc = xp.nextText();
						Log.d("june", "검색결과 : " + sizewidthsrc);
						npsi.w = sizewidthsrc;
						
						//마지막으로 어레이 리스트에 방금 만들어진 아이템을 넣어줍니다.
						//루프가 돌떄마다 아이템은 계속 새로 만들어지고, 
						//어레이 리스트에 차곡차곡 쌓이게됩니다.
						arryNpsi.add(npsi);
					}

					//에러코드 골라내기. 여기서 찍히는 에러코드를 네이버에 조회해보면 어떤 문제가 발생했는지 빠르게 판단가능.
					//url에 띄어쓰기가 잘못들어가서 한시간 해맸는데 그 에러코드는 011번이 찍히더군요.
					//네이버 들어가면 쿼리가 잘못됬다고 단번에 나옵니다. ( __);
					if(tag.compareTo("error_code") == 0){
						Log.d("june", "에러에러 : " + xp.nextText());
					}
					
					break;

				}
				
				//한줄에 대한 파싱이 끝났으니 다음 테그를 찾아 넘깁니다.
				//이건 엔드도큐먼트가 나올때까지 반복합니다.
				parserEvent = xp.next();
				
			}
			
		}catch (Exception e) {
			Log.d("june", "파싱중 에러발생. : " + e);
		}
		
		//메세지 하나를 제작하여 핸들러에 타넘긴다.
		//액티비티에 존재하는 핸들러는 이 메세지가 도착하면
		//파싱이 완료된걸 인식하고 프로그레스 다이얼로그를 닫는다.
		Message msg = new Message();
		msg.arg1 = 100;
		h.sendMessage(msg);
		return arryNpsi;
		
	}

	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		mProgress = new ProgressDialog(((Activity)c));
		mProgress.setTitle("데이터 로딩");
		mProgress.setMessage("웹 사이트로부터 정보를 받아오고있습니다. 잠시만 기다려주십시오.");
		mProgress.setIndeterminate(true);
		mProgress.setCancelable(true);
		mProgress.show();
		
		super.onPreExecute();
	}
	
	@Override
	protected Integer doInBackground(Integer... params) {
		// TODO Auto-generated method stub
		getNaverData();
		return null;
	}
	
	@Override
	protected void onPostExecute(Integer result) {
		// TODO Auto-generated method stub
		mProgress.dismiss();
		
		super.onPostExecute(result);
	}
	
	
	
	

}
